Skip to content

淺談 SQL Server WHERE 子句的 NULL 判斷

TLDR

  • 在 SQL Server 的 WHERE 子句中,判斷欄位是否為 NULL 必須使用 IS NULLIS NOT NULL,使用 = NULL 會導致邏輯錯誤。
  • SQL 的邏輯運算結果除了 TRUEFALSE 外,還存在 UNKNOWN
  • WHERE 子句僅會篩選出結果為 TRUE 的資料列。
  • 任何值(包含 NULL 本身)與 NULL 進行比較,結果皆為 UNKNOWN
  • 建議在查詢邏輯中盡量避免產生 UNKNOWN 狀態,以確保查詢結果符合預期。
  • 官方建議使用 <> 作為標準的不等於運算子,儘管 SQL Server 亦支援 !=

NULL 的比較邏輯與 UNKNOWN 狀態

什麼情況下會遇到這個問題:當開發者習慣使用程式語言的相等運算子(如 ===)來判斷資料庫欄位是否為空值時。

在 SQL 中,NULL 代表「未知的值」。由於其未知特性,任何值與 NULL 進行比較(例如 Column = NULL),其運算結果皆為 UNKNOWN。由於 WHERE 子句只會回傳邏輯判斷為 TRUE 的資料列,因此使用 = NULL 將永遠無法篩選出任何資料。

UNKNOWN 的邏輯運算規則

若查詢條件涉及多個邏輯運算,UNKNOWN 會影響最終的判斷結果:

AND 運算邏輯

運算式 1運算式 2結果
TRUEUNKNOWNUNKNOWN
UNKNOWNUNKNOWNUNKNOWN
FALSEUNKNOWNFALSE

OR 運算邏輯

運算式 1運算式 2結果
TRUEUNKNOWNTRUE
UNKNOWNUNKNOWNUNKNOWN
FALSEUNKNOWNUNKNOWN

小結論

判斷 NULL 時務必使用 IS NULLIS NOT NULL。由於 UNKNOWN 的邏輯行為較為複雜且容易產生非預期的查詢結果,建議在設計查詢條件時,應盡量避免讓邏輯運算產生 UNKNOWN 狀態。

SQL 不等於運算子規範

什麼情況下會遇到這個問題:在撰寫跨資料庫系統的 SQL 語法或進行程式碼維護時,對於 !=<> 的選擇感到困惑。

雖然 SQL Server 同時支援 <>!=,但根據 Microsoft 官方文件<> 才是 ANSI SQL 標準中定義的不等於運算子。

小結論

為了維持 SQL 語法的標準性與相容性,建議優先使用 <> 作為不等於的判斷運算子。

參考資料

異動歷程

    • 初版文件建立。